Kotlin Functions

Kotlin Functions(科特林函数/方法)

目录:

1、Function Declarations(函数的定义)
2、Function Usage(函数的用法)
3、Parameters(参数)
4、Default Arguments(默认参数)
5、Named Arguments(命名参数)
6、Unit-returning functions(函数返回类型为:Unit)
7、Single-Expression functions(单个表达式的函数)
8、Variable number of arguments(Varargs)(可变数量参数)
9、Infix notation(中缀表示法)
10、Function Scope(函数范围)
11、Generic Functions(通用函数/泛型函数)
12、Tail recursive functions(尾递归函数)

1. Function Declarations(函数/方法的定义)

使用fun关键字进行定义函数

fun double(x: Int): Int {
    return 2 * x
}

2. Function Usage(函数的使用/调用)

调用函数使用传统方法

val result = double(2)

使用点符号调用

Sample().foo()

3. Parameters(参数)

函数参数的定义格式:name:Type,以“,”分隔参数

fun double(x: Int, y: Int): Int {
    return 2 * (x + y)
}

4. Default Arguments(参数的默认值)

函数的参数可以有一个默认的值,

fun double(x: Int = 0, y: Int = 0): Int {
    return 2 * (x + y)
}

覆盖方法始终使用与基本方法相同的默认参数值。使用默认参数值覆盖方法时,忽略参数默认值

open class A {
    open fun foo(i: Int = 10) {

    }
}

class B : A() {
    //// no default value allowed
    override fun foo(i: Int) {
        super.foo(i)
    }
}

调用函数,使用函数的默认参数值

fun defaultParam(a: Int = 0, b: Int): Int {

    return a + b;
}
//使用defaultParam(b = 2),等同于defaultParam(a = 0,b = 2)
val defaultParamResult = defaultParam(b = 2)

如果默认参数之后的最后一个参数是lambda,他可以作为命名参数传递,也可以在括号之外传递

fun fooFunction(bar: Int = 1, baz: Int = 1, lamb: () -> Int): Int {
    println("foo: lambda result=${lamb()}")
    return lamb()
}

  //括号之外传递
val lambdaParamOutResult = fooFunction {
    ""
    1
}
//括号之内传递
val lambdaParamInResult = fooFunction(lamb = {
    ""
    1
})
//括号之内传递,并且全参数赋值
val lambdaParamFullResult = fooFunction(1, 2, lamb = {
    ""
    1
})

5. 命名参数->使代码更具可读性

调用函数时可以命名函数参数。当函数具有大量参数或默认参数时,这非常方便。

如下函数:

fun reformat(str: String,
             normalizeCase: Boolean = true,
             upperCaseFirstLetter: Boolean = true,
             divideByCamelHumps: Boolean = false,
             wordSeparator: Char = ' ') {
}

使用默认参数调用:

val str = "";
reformat(str)

使用非默认参数调用:

val str = "";
reformat(str, true, true, false, '_')

使用命名参数调用->使代码更具可读性:

val str = "";
reformat(str, normalizeCase = true, upperCaseFirstLetter = true, divideByCamelHumps = false, wordSeparator = '_')

使用命名参数调用->不需要所有的参数

val str = "";
reformat(str, wordSeparator = '_')

当使用位置参数和命名参数调用函数时,所有位置参数应放在第一个命名参数之前。例如,f(1,y=1)允许,f(x=1,2)不允许

fun reformatTwo(
    str: String = "",
    normalizeCase: Boolean,
    upperCaseFirstLetter: Boolean = true,
    divideByCamelHumps: Boolean = false,
    wordSeparator: Char = ' '
) {

}

不允许此调用方式

//is not allowed.
reformatTwo(str = "", false)
//is allowed
reformatTwo(str = "", normalizeCase = false)

允许此调用方式

//is allowed
reformatTwo(str = "", normalizeCase = false)

6. Unit-returning functions

如果一个函数没有返回值,那么他的返回值类型是Unit

fun nullReturnType(): Unit {

}

Unit可省略

fun nullReturnType() {

}

7. Single-Expression functions

当函数返回单个表达式时,可以省略花括号,并在‘=’符号后指定‘函数体’

fun singleExpression(a: Int, b: Int): Int = a + b;

显示声明的返回类型是可选的/可省略的

fun singleExpression(a: Int, b: Int) = a + b;

8. Variable number of arguments(varargs)

可变数量的参数

fun varargParameter(vararg parameters: String): Int {

    return parameters.size;
}



varargParameter("one", "two", "three");

9. Infix notation(中缀表示法)

中缀表示法:省略点和括号

  1. 必须是成员函数或扩展函数
  2. 必须有一个参数
  3. 参数不能接收可变数量的参数,不能有默认值
infix fun Int.complete(num: Int) {

}


//正常的调用函数
1.complete(1)

//使用"中缀表达法"调用函数
1 complete 1

10. Function Scope

  1. Local Functions(函数内的函数)
  2. Member Functions(成员函数)

Local Functions(定义在函数内的函数)

fun function(name: String) {
    fun localFunction(name: String): String {
        return "local->$name"
    }

    val result = localFunction(name)
}

Member Functions(定义在类/对象中的函数)

class Sample(){
    fun foo(){}
}

11. Generic Functions(通用函数/泛型函数)

fun <T> singletonList(item: T): List<T> {
    return listOf<T>(item)
}

12. Tail recursive functions(尾递归函数)

Kotlin支持一种称为“尾递归”的函数式变成。这允许一些通常使用循环编写的算法改为使用尾递归函数编写,但没有溢出的风险。当一个函数用tailrec修饰符标记并满足所需的形式时,编译器会优化递归,而是留下一个快速有效的基于循环的版本:

tailrec修饰的尾递归的函数

/*
tailrec修饰符关键字:将函数标记为‘尾递归’
尾递归函数
 */
const val EPS = 10
tailrec fun findFixPoint(x: Double = 1.0): Double =
    if (Math.abs((x - Math.cos(x))) < EPS) x else findFixPoint(Math.cos(x))

等同于:

const val EPS = 10
fun findFixPoint(): Double {
    var x = 1.0
    while (true) {
        val y = Math.cos(x)
        if (Math.abs(x - y) < EPS) {
            return x
        }
        x = Math.cos(x)

    }
}

未完待续。。。


   转载规则


《Kotlin Functions》 Air 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录